Une introduction à l'utilisation de tcpdump sur la ligne de commande Linux

Tcpdump est un utilitaire de ligne de commande qui vous permet de capturer et d'analyser le trafic réseau passant par votre système. Il est souvent utilisé pour aider à résoudre les problèmes de réseau, ainsi qu'un outil de sécurité.

Un outil puissant et polyvalent qui comprend de nombreuses options et filtres, tcpdump peut être utilisé dans une variété de cas. Puisqu'il s'agit d'un outil en ligne de commande, il est idéal pour s'exécuter sur des serveurs ou des périphériques distants pour lesquels une interface graphique n'est pas disponible, pour collecter des données qui peuvent être analysées ultérieurement. Il peut également être lancé en arrière-plan ou en tant que tâche planifiée à l'aide d'outils tels que cron.

Dans cet article, nous examinerons certaines des fonctionnalités les plus courantes de tcpdump.

1. Installation sous Linux

Tcpdump est inclus avec plusieurs distributions Linux, il y a donc de fortes chances que vous l'ayez déjà installé. Vérifiez si tcpdump est installé sur votre système avec la commande suivante:

$ which tcpdump

/usr/sbin/tcpdump

 

Si tcpdump n'est pas installé, vous pouvez l'installer en utilisant le gestionnaire de packages de votre distribution. Par exemple, sur CentOS ou Red Hat Enterprise Linux, comme ceci:

$ sudo yum install -y tcpdump

Tcpdump nécessite libpcap , qui est une bibliothèque pour la capture de paquets réseau. S'il n'est pas installé, il sera automatiquement ajouté en tant que dépendance.

Vous êtes prêt à commencer à capturer certains paquets.

2. Capture de paquets avec tcpdump

Pour capturer des paquets pour le dépannage ou l'analyse, tcpdump nécessite des autorisations élevées, donc dans les exemples suivants la plupart des commandes sont préfixées avec sudo .

Pour commencer, utilisez la commande tcpdump -D pour voir quelles interfaces sont disponibles pour la capture:

$ sudo tcpdump -D

1.eth0

2.virbr0

3.eth1

4.any (Pseudo-device that captures on all interfaces)

5.lo [Loopback]

Dans l'exemple ci-dessus, vous pouvez voir toutes les interfaces disponibles sur ma machine. L'interface spéciale any permet de capturer dans n'importe quelle interface active.

Utilisons-le pour commencer à capturer certains paquets. Capturez tous les paquets dans n'importe quelle interface en exécutant cette commande:

$ sudo tcpdump -i any

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

09:56:18.293641 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3770820720:3770820916, ack 3503648727, win 309, options [nop,nop,TS val 76577898 ecr 510770929], length 196

09:56:18.293794 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 391, options [nop,nop,TS val 510771017 ecr 76577898], length 0

09:56:18.295058 IP rhel75.59883 > gateway.domain: 2486+ PTR? 1.64.168.192.in-addr.arpa. (43)

09:56:18.310225 IP gateway.domain > rhel75.59883: 2486 NXDomain* 0/1/0 (102)

09:56:18.312482 IP rhel75.49685 > gateway.domain: 34242+ PTR? 28.64.168.192.in-addr.arpa. (44)

09:56:18.322425 IP gateway.domain > rhel75.49685: 34242 NXDomain* 0/1/0 (103)

09:56:18.323164 IP rhel75.56631 > gateway.domain: 29904+ PTR? 1.122.168.192.in-addr.arpa. (44)

09:56:18.323342 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 196:584, ack 1, win 309, options [nop,nop,TS val 76577928 ecr 510771017], length 388

09:56:18.323563 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 584, win 411, options [nop,nop,TS val 510771047 ecr 76577928], length 0

09:56:18.335569 IP gateway.domain > rhel75.56631: 29904 NXDomain* 0/1/0 (103)

09:56:18.336429 IP rhel75.44007 > gateway.domain: 61677+ PTR? 98.122.168.192.in-addr.arpa. (45)

09:56:18.336655 IP gateway.domain > rhel75.44007: 61677* 1/0/0 PTR rhel75. (65)

09:56:18.337177 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 584:1644, ack 1, win 309, options [nop,nop,TS val 76577942 ecr 510771047], length 1060

 

---- SKIPPING LONG OUTPUT -----

 

09:56:19.342939 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 1752016, win 1444, options [nop,nop,TS val 510772067 ecr 76578948], length 0

^C

9003 packets captured

9010 packets received by filter

7 packets dropped by kernel

$

 

Tcpdump continue de capturer les paquets jusqu'à ce qu'il reçoive un signal d'interruption. Vous pouvez interrompre la capture en appuyant sur Ctrl+C Comme vous pouvez le voir dans cet exemple, tcpdump capturé plus de 9 000 paquets. Dans ce cas, puisque je suis connecté à ce serveur en utilisant ssh , tcpdump a capturé tous ces paquets. Pour limiter le nombre de paquets capturés et arrêter tcpdump , utilisez l'option -c :

$ sudo tcpdump -i any -c 5

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

11:21:30.242740 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3772575680:3772575876, ack 3503651743, win 309, options [nop,nop,TS val 81689848 ecr 515883153], length 196

11:21:30.242906 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 1443, options [nop,nop,TS val 515883235 ecr 81689848], length 0

11:21:30.244442 IP rhel75.43634 > gateway.domain: 57680+ PTR? 1.64.168.192.in-addr.arpa. (43)

11:21:30.244829 IP gateway.domain > rhel75.43634: 57680 NXDomain 0/0/0 (43)

11:21:30.247048 IP rhel75.33696 > gateway.domain: 37429+ PTR? 28.64.168.192.in-addr.arpa. (44)

5 packets captured

12 packets received by filter

0 packets dropped by kernel

$

 

Dans ce cas, tcpdump arrêté la capture automatiquement après avoir capturé cinq paquets. Cela est utile dans différents scénarios: par exemple, si vous dépannez la connectivité et que la capture de quelques paquets initiaux est suffisante. C'est encore plus utile lorsque nous appliquons des filtres pour capturer des paquets spécifiques (illustrés ci-dessous).

Par défaut, tcpdump résout les adresses IP et les ports en noms, comme indiqué dans l'exemple précédent. Lors du dépannage de problèmes de réseau, il est souvent plus facile d'utiliser les adresses IP et les numéros de port; désactiver la résolution de noms en utilisant l'option -n et la résolution de port avec -nn :

$ sudo tcpdump -i any -c5 -nn

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

23:56:24.292206 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 166198580:166198776, ack 2414541257, win 309, options [nop,nop,TS val 615664 ecr 540031155], length 196

23:56:24.292357 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 196, win 1377, options [nop,nop,TS val 540031229 ecr 615664], length 0

23:56:24.292570 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 372

23:56:24.292655 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 568, win 1400, options [nop,nop,TS val 540031229 ecr 615664], length 0

23:56:24.292752 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 568:908, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 340

5 packets captured

6 packets received by filter

0 packets dropped by kernel

 

Comme indiqué ci-dessus, la sortie de capture affiche désormais les adresses IP et les numéros de port. Cela empêche également tcpdump d'émettre des recherches DNS, ce qui contribue à réduire le trafic réseau tout en résolvant les problèmes de réseau.

Maintenant que vous pouvez capturer des paquets réseau, explorons ce que signifie cette sortie.

3. Comprendre le format de sortie

Tcpdump est capable de capturer et de décoder de nombreux protocoles différents, tels que TCP, UDP, ICMP et bien d'autres. Bien que nous ne puissions pas tous les couvrir ici, pour vous aider à démarrer, explorons le paquet TCP. Vous pouvez trouver plus de détails sur les différents formats de protocole dans les pages de manuel de tcpdump. Un paquet TCP typique capturé par tcpdump ressemble à ceci:

08:41:13.729687 IP 192.168.64.28.22 > 192.168.64.1.41916: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 117964079 ecr 816509256], length 372

Les champs peuvent varier en fonction du type de paquet envoyé, mais il s'agit du format général.

Le premier champ, 08:41:13.729687, représente l'horodatage du paquet reçu selon l'horloge locale.

Ensuite, IP représente le protocole de couche réseau - dans ce cas, IPv4 . Pour IPv6 paquets IPv6 , la valeur est IP6 .

Le champ suivant, 192.168.64.28.22 , est l'adresse IP et le port source. Ceci est suivi de l'adresse IP et du port de destination, représentés par 192.168.64.1.41916 .

Après la source et la destination, vous pouvez trouver les drapeaux TCP Flags [P.] . Les valeurs typiques pour ce champ incluent:

Valeur

Type de drapeau

La description

S

SYN

Début de connexion

F

FIN

Fin de la connexion

P

PUSH

Poussée des données

R

RST

Connexion réinitialisée

.

ACK

Reconnaissance

Ce champ peut également être une combinaison de ces valeurs, comme [S.] pour un paquet SYN-ACK .

Vient ensuite le numéro de séquence des données contenues dans le paquet. Pour le premier paquet capturé, il s'agit d'un nombre absolu. Les paquets suivants utilisent un nombre relatif pour le rendre plus facile à suivre. Dans cet exemple, la séquence est seq 196:568, ce qui signifie que ce paquet contient les octets 196 à 568 de ce flux.

Il est suivi du numéro d' ack 1 : ack 1 . Dans ce cas, il est de 1 car il s'agit du côté qui envoie les données. Pour le côté recevant des données, ce champ représente le prochain octet attendu (données) sur ce flux. Par exemple, le numéro d'acquittement pour le prochain paquet dans ce flux serait 568.

Le champ suivant est la taille de fenêtre win 309 , qui représente le nombre d'octets disponibles dans le tampon de réception, suivi par les options TCP telles que le MSS (taille maximale du segment) ou l'échelle de fenêtre. Pour plus de détails sur les options du protocole TCP, consultez Paramètres de TCP (Transmission Control Protocol) .

Enfin, nous avons la longueur de paquet, la length 372 , qui représente la longueur, en octets, des données de charge utile. La longueur est la différence entre le dernier et le premier octet du numéro de séquence.

Maintenant, apprenons à filtrer les paquets pour affiner les résultats et faciliter le dépannage de problèmes spécifiques.

4. Filtrage des paquets

Comme mentionné ci-dessus, tcpdump peut capturer trop de paquets, dont certains ne sont même pas liés au problème que vous dépannez. Par exemple, si vous dépannez un problème de connectivité avec un serveur Web, vous n'êtes pas intéressé par le trafic SSH, donc la suppression des paquets SSH de la sortie facilite le travail sur le vrai problème.

L'une des fonctionnalités les plus puissantes de tcpdump est sa capacité à filtrer les paquets capturés à l'aide de divers paramètres, tels que les adresses IP source et de destination, les ports, les protocoles, etc. Voyons quelques-uns des plus courants.

Protocole

Pour filtrer les paquets en fonction du protocole, en spécifiant le protocole dans la ligne de commande. Par exemple, capturez des paquets ICMP uniquement à l'aide de cette commande:

$ sudo tcpdump -i any -c5 icmp

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

 

Dans un autre terminal, essayez d'envoyer une requête ping à une autre machine:

$ ping opensource.com

PING opensource.com (54.204.39.132) 56(84) bytes of data.

64 bytes from ec2-54-204-39-132.compute-1.amazonaws.com (54.204.39.132): icmp_seq=1 ttl=47 time=39.6 ms

 

De retour dans la capture tcpdump, notez que tcpdump capture et affiche uniquement les paquets liés à ICMP. Dans ce cas, tcpdump n'affiche pas les paquets de résolution de noms qui ont été générés lors de la résolution du nom opensource.com :

09:34:20.136766 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 1, length 64

09:34:20.176402 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 1, length 64

09:34:21.140230 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 2, length 64

09:34:21.180020 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 2, length 64

09:34:22.141777 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 3, length 64

5 packets captured

5 packets received by filter

0 packets dropped by kernel

 

Hôte

Limitez la capture aux seuls paquets liés à un hôte spécifique en utilisant le filtre d' host :

$ sudo tcpdump -i any -c5 -nn port 80

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

09:58:28.790548 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [S], seq 1745665159, win 29200, options [mss 1460,sackOK,TS val 122599140 ecr 0,nop,wscale 7], length 0

09:58:28.834026 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [S.], seq 4063583040, ack 1745665160, win 28960, options [mss 1460,sackOK,TS val 522775728 ecr 122599140,nop,wscale 9], length 0

09:58:28.834093 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122599183 ecr 522775728], length 0

09:58:28.834588 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122599184 ecr 522775728], length 112: HTTP: GET / HTTP/1.1

09:58:28.878445 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [.], ack 113, win 57, options [nop,nop,TS val 522775739 ecr 122599184], length 0

5 packets captured

5 packets received by filter

0 packets dropped by kernel

 

Dans cet exemple, tcpdump capture et affiche uniquement les paquets vers et depuis l'hôte 54.204.39.132 .

Port

Pour filtrer les paquets en fonction du service ou du port souhaité, utilisez le filtre de port . Par exemple, capturez des paquets liés à un service Web (HTTP) à l'aide de cette commande:

$ sudo tcpdump -i any -c5 -nn src 192.168.122.98

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

10:02:15.220824 IP 192.168.122.98.39436 > 192.168.122.1.53: 59332+ A? opensource.com. (32)

10:02:15.220862 IP 192.168.122.98.39436 > 192.168.122.1.53: 20749+ AAAA? opensource.com. (32)

10:02:15.364062 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [S], seq 1108640533, win 29200, options [mss 1460,sackOK,TS val 122825713 ecr 0,nop,wscale 7], length 0

10:02:15.409229 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [.], ack 669337581, win 229, options [nop,nop,TS val 122825758 ecr 522832372], length 0

10:02:15.409667 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 122825759 ecr 522832372], length 112: HTTP: GET / HTTP/1.1

5 packets captured

5 packets received by filter

0 packets dropped by kernel

IP source / nom d'hôte

Vous pouvez également filtrer les paquets en fonction de l'adresse IP source ou de destination ou du nom d'hôte. Par exemple, pour capturer des paquets à partir de l'hôte 192.168.122.98 :

$ sudo tcpdump -i any -c5 -nn src 192.168.122.98

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

10:02:15.220824 IP 192.168.122.98.39436 > 192.168.122.1.53: 59332+ A? opensource.com. (32)

10:02:15.220862 IP 192.168.122.98.39436 > 192.168.122.1.53: 20749+ AAAA? opensource.com. (32)

10:02:15.364062 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [S], seq 1108640533, win 29200, options [mss 1460,sackOK,TS val 122825713 ecr 0,nop,wscale 7], length 0

10:02:15.409229 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [.], ack 669337581, win 229, options [nop,nop,TS val 122825758 ecr 522832372], length 0

10:02:15.409667 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 122825759 ecr 522832372], length 112: HTTP: GET / HTTP/1.1

5 packets captured

5 packets received by filter

0 packets dropped by kernel

 

Notez que tcpdumps a capturé des paquets avec l'adresse IP source 192.168.122.98 pour plusieurs services tels que la résolution de noms (port 53) et HTTP (port 80). Les paquets de réponse ne sont pas affichés car leur IP source est différente.

Inversement, vous pouvez utiliser le filtre dst pour filtrer par IP de destination / nom d'hôte:

$ sudo tcpdump -i any -c5 -nn dst 192.168.122.98

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

10:05:03.572931 IP 192.168.122.1.53 > 192.168.122.98.47049: 2248 1/0/0 A 54.204.39.132 (48)

10:05:03.572944 IP 192.168.122.1.53 > 192.168.122.98.47049: 33770 0/0/0 (32)

10:05:03.621833 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [S.], seq 3474204576, ack 3256851264, win 28960, options [mss 1460,sackOK,TS val 522874425 ecr 122993922,nop,wscale 9], length 0

10:05:03.667767 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [.], ack 113, win 57, options [nop,nop,TS val 522874436 ecr 122993972], length 0

10:05:03.672221 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 522874437 ecr 122993972], length 642: HTTP: HTTP/1.1 302 Found

5 packets captured

5 packets received by filter

0 packets dropped by kernel

Expressions complexes

Vous pouvez également combiner des filtres en utilisant les opérateurs logiques and et or pour créer des expressions plus complexes. Par exemple, pour filtrer les paquets de l'adresse IP source 192.168.122.98 et desservir HTTP uniquement, utilisez cette commande:

$ sudo tcpdump -i any -c5 -nn src 192.168.122.98 and port 80

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

10:08:00.472696 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [S], seq 2712685325, win 29200, options [mss 1460,sackOK,TS val 123170822 ecr 0,nop,wscale 7], length 0

10:08:00.516118 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 268723504, win 229, options [nop,nop,TS val 123170865 ecr 522918648], length 0

10:08:00.516583 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 123170866 ecr 522918648], length 112: HTTP: GET / HTTP/1.1

10:08:00.567044 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 123170916 ecr 522918661], length 0

10:08:00.788153 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [F.], seq 112, ack 643, win 239, options [nop,nop,TS val 123171137 ecr 522918661], length 0

5 packets captured

5 packets received by filter

0 packets dropped by kernel  

 

Vous pouvez créer des expressions plus complexes en regroupant le filtre avec des parenthèses. Dans ce cas, placez l'intégralité de l'expression de filtre entre guillemets pour empêcher le shell de les confondre avec des expressions de shell:

$ sudo tcpdump -i any -c5 -nn "port 80 and (src 192.168.122.98 or src 54.204.39.132)"

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

10:10:37.602214 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [S], seq 871108679, win 29200, options [mss 1460,sackOK,TS val 123327951 ecr 0,nop,wscale 7], length 0

10:10:37.650651 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [S.], seq 854753193, ack 871108680, win 28960, options [mss 1460,sackOK,TS val 522957932 ecr 123327951,nop,wscale 9], length 0

10:10:37.650708 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 0

10:10:37.651097 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 112: HTTP: GET / HTTP/1.1

10:10:37.692900 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [.], ack 113, win 57, options [nop,nop,TS val 522957942 ecr 123328000], length 0

5 packets captured

5 packets received by filter

0 packets dropped by kernel

 

Dans cet exemple, nous filtrons les paquets pour le service HTTP uniquement (port 80) et les adresses IP source 192.168.122.98 ou 54.204.39.132 . Il s'agit d'un moyen rapide d'examiner les deux côtés d'un même flux.

5. Vérification du contenu des paquets

Dans les exemples précédents, nous vérifions uniquement les en-têtes des paquets pour des informations telles que la source, les destinations, les ports, etc. Parfois, c'est tout ce dont nous avons besoin pour résoudre les problèmes de connectivité réseau. Parfois, cependant, nous devons inspecter le contenu du paquet pour nous assurer que le message que nous envoyons contient ce dont nous avons besoin ou que nous avons reçu la réponse attendue. Pour voir le contenu du paquet, tcpdump fournit deux indicateurs supplémentaires: -X pour imprimer le contenu en hexadécimal et ASCII ou -A pour imprimer le contenu en ASCII.

Par exemple, inspectez le contenu HTTP d'une demande Web comme ceci:

$ sudo tcpdump -i any -c10 -nn -A port 80

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

13:02:14.871803 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [S], seq 2546602048, win 29200, options [mss 1460,sackOK,TS val 133625221 ecr 0,nop,wscale 7], length 0

E..<..@.@.....zb6.'....P...@......r............

............................

13:02:14.910734 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [S.], seq 1877348646, ack 2546602049, win 28960, options [mss 1460,sackOK,TS val 525532247 ecr 133625221,nop,wscale 9], length 0

E..<..@./..a6.'...zb.P..o..&...A..q a..........

.R.W.......     ................

13:02:14.910832 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 133625260 ecr 525532247], length 0

E..4..@.@.....zb6.'....P...Ao..'...........

.....R.W................

13:02:14.911808 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 133625261 ecr 525532247], length 112: HTTP: GET / HTTP/1.1

E.....@.@..1..zb6.'....P...Ao..'...........

.....R.WGET / HTTP/1.1

User-Agent: Wget/1.14 (linux-gnu)

Accept: */*

Host: opensource.com

Connection: Keep-Alive

 

................

13:02:14.951199 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [.], ack 113, win 57, options [nop,nop,TS val 525532257 ecr 133625261], length 0

E..4.F@./.."6.'...zb.P..o..'.......9.2.....

.R.a....................

13:02:14.955030 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 525532258 ecr 133625261], length 642: HTTP: HTTP/1.1 302 Found

E....G@./...6.'...zb.P..o..'.......9.......

.R.b....HTTP/1.1 302 Found

Server: nginx

Date: Sun, 23 Sep 2018 17:02:14 GMT

Content-Type: text/html; charset=iso-8859-1

Content-Length: 207

X-Content-Type-Options: nosniff

Location: https://opensource.com/

Cache-Control: max-age=1209600

Expires: Sun, 07 Oct 2018 17:02:14 GMT

X-Request-ID: v-6baa3acc-bf52-11e8-9195-22000ab8cf2d

X-Varnish: 632951979

Age: 0

Via: 1.1 varnish (Varnish/5.2)

X-Cache: MISS

Connection: keep-alive

 

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

<html><head>

<title>302 Found</title>

</head><body>

<h1>Found</h1>

<p>The document has moved <a href="https://opensource.com/">here</a>.</p>

</body></html>

................

13:02:14.955083 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 133625304 ecr 525532258], length 0

E..4..@.@.....zb6.'....P....o..............

.....R.b................

13:02:15.195524 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 133625545 ecr 525532258], length 0

E..4..@.@.....zb6.'....P....o..............

.....R.b................

13:02:15.236592 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 525532329 ecr 133625545], length 0

E..4.H@./.. 6.'...zb.P..o..........9.I.....

.R......................

13:02:15.236656 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 133625586 ecr 525532329], length 0

E..4..@.@.....zb6.'....P....o..............

.....R..................

10 packets captured

10 packets received by filter

0 packets dropped by kernel

 

Cela est utile pour résoudre les problèmes liés aux appels d'API, en supposant que les appels utilisent du HTTP simple. Pour les connexions chiffrées, cette sortie est moins utile.

6. Sauvegarde des captures dans un fichier

Une autre fonctionnalité utile fournie par tcpdump est la possibilité d'enregistrer la capture dans un fichier afin que vous puissiez analyser les résultats plus tard. Cela vous permet de capturer des paquets en mode batch pendant la nuit, par exemple, et de vérifier les résultats le matin. Cela aide également lorsqu'il y a trop de paquets à analyser car la capture en temps réel peut se produire trop rapidement.

Pour enregistrer des paquets dans un fichier au lieu de les afficher à l'écran, utilisez l'option -w :

$ sudo tcpdump -i any -c10 -nn -w webserver.pcap port 80

[sudo] password for ricardo:

tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

10 packets captured

10 packets received by filter

0 packets dropped by kernel

 

Cette commande enregistre la sortie dans un fichier nommé webserver.pcap . L'extension .pcap signifie «capture de paquets» et est la convention pour ce format de fichier.

Comme le montre cet exemple, rien ne s'affiche à l'écran et la capture se termine après la capture de 10 paquets, selon l'option -c10 . Si vous souhaitez obtenir des commentaires pour vous assurer que les paquets sont capturés, utilisez l'option -v .

Tcpdump crée un fichier au format binaire, vous ne pouvez donc pas simplement l'ouvrir avec un éditeur de texte. Pour lire le contenu du fichier, exécutez tcpdump avec l'option -r :

$ tcpdump -nn -r webserver.pcap

reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)

13:36:57.679494 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [S], seq 3709732619, win 29200, options [mss 1460,sackOK,TS val 135708029 ecr 0,nop,wscale 7], length 0

13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0

13:36:57.719005 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 0

13:36:57.719186 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 112: HTTP: GET / HTTP/1.1

13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0

13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found

13:36:57.760182 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 135708109 ecr 526052959], length 0

13:36:57.977602 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 135708327 ecr 526052959], length 0

13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0

13:36:58.022132 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 135708371 ecr 526053025], length 0

$

 

Puisque vous ne capturez plus les paquets directement à partir de l'interface réseau, sudo n'est pas requis pour lire le fichier.

Vous pouvez également utiliser l'un des filtres dont nous avons parlé pour filtrer le contenu du fichier, comme vous le feriez avec des données en temps réel. Par exemple, inspectez les paquets dans le fichier de capture à partir de l'adresse IP source 54.204.39.132 en exécutant cette commande:

$ tcpdump -nn -r webserver.pcap src 54.204.39.132

reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)

13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0

13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0

13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found

13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0

 

Et après?

Ces fonctionnalités de base de tcpdump vous aideront à démarrer avec cet outil puissant et polyvalent. Pour en savoir plus, consultez le site Web et les pages de manuel de tcpdump .

L'interface de ligne de commande tcpdump offre une grande flexibilité pour capturer et analyser le trafic réseau. Si vous avez besoin d'un outil graphique pour comprendre des flux plus complexes, regardez Wireshark .

Un avantage de Wireshark est qu'il peut lire les fichiers .pcap capturés par tcpdump. Vous pouvez utiliser tcpdump pour capturer des paquets sur une machine distante qui n'a pas d'interface graphique et analyser le fichier de résultat avec Wireshark, mais c'est un sujet pour un autre jour.